package com.duoduo.树;

/**
 * @author dl.chai
 * @version 1.0
 * @description: 不同的二叉搜索树96
 * 给你一个整数 n ，求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种？返回满足题意的二叉搜索树的种数。
 * 这道题目虽然在力扣上标记是中等难度，但可以算是困难了！
 *
 *
 * 示例 1：
 *
 *
 * 输入：n = 3
 * 输出：5
 * 示例 2：
 *
 * 输入：n = 1
 * 输出：1
 * @date 2023/3/14 20:45
 */

public class 不同的二叉搜索树96 {
    public int numTrees(int n) {
        int[] dp=new int[n+1];
        //初始化0个节点和1个节点的情况
        dp[0]=1;
        dp[1]=1;
        // dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]
        for(int i=2;i<=n;i++){
            for(int j=1;j<=i;j++){
                //对于第i个节点，需要考虑1作为根节点直到i作为根节点的情况，所以需要累加
                //一共i个节点，对于根节点j时,左子树的节点个数为j-1，右子树的节点个数为i-j
                dp[i]+=dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
}
